﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Web;
using System.Net;
using System.Security.Cryptography;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;

namespace TestJKMPro
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string getSignTime()
        {
            
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1));
            DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
            TimeSpan toNow = dtNow.Subtract(dtStart);
            return  toNow.Ticks.ToString();
            
            //var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
            //return timeSpan.TotalSeconds.ToString();

            
        }

        private string calcSign(string data,string token,string nonce)
        {
            var sign =  data+token+nonce+data;
           byte[] bytes = Encoding.UTF8.GetBytes(sign);
           byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
 
           StringBuilder builder = new StringBuilder();
           for (int i = 0; i < hash.Length; i++)
           {
               builder.Append(hash[i].ToString("x2"));
           }
           return builder.ToString().ToUpper();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            /*
            x-tif-paasid	字符串	是	头		请求方的appnCode
            x-tif-serviceId	字符串	是	头		服务方的serviceCode
            x-tif-signature	字符串	是	头		签名字符串，详见签名算法
            x-tif-timestamp	长整形	是	头		当前 unix 时间戳
            x-tif-nonce	字符串	是	头		您（调用者）生成的非重复的随机字符串
            x-tif- end_user.name	字符串	否	头		终端访问用户姓名
            x-tif- end_user.id_card	字符串	否	头		终端访问用户身份标识号码
            x-tif- end_user.department	字符串	否	头		终端访问用户所在单位
            x-tif- end_user.certificate	字符串	否	头		终端访问用户数字证书编号
            x-tif- end_user.device_id	字符串	否	头		终端标识可以是pc的ip或者移动设备的mac
            x-tif- reason	字符串	否	头		调用理由，原因
            x-tif- timeout	整形	否	头		单位秒，超时后返回task_id 后续获取结果0 ：立即返回   -1：系统最大值
            x-tif- task_id	字符串	否	头		本次任务的唯一编号，由总线产生；为空时为请求访问；有值时为异步结果获取
            */

            
            string sXM = textBoxXM.Text;          //XM String 是 姓名
            string sSFZH = textBoxSFZH.Text;      //SFZH String 是 身份证号
            string sSBID = textBoxDEVICE_ID.Text; //DEVICE_ID String 是 设备ID
            
            
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            WebClient wc = new WebClient();

            string passid = "zwdsj_jmwjj_jmwyzyy";  //
            string timestamp = getSignTime();
            string token = "28ca6c78fee64131a1bb283b65192a1e";  //PaaSToken：请求方申请注册接口，返回的结果中的paasToken；
            string nonce= Guid.NewGuid().ToString(); //您（调用者）生成的非重复的随机字符串
            string sign = calcSign(timestamp,token,nonce);

            
            wc.Headers.Add("Content-Type","application/json");  //
            wc.Headers.Add("x-tif-paasid", passid);  //字符串	是	头		请求方的appnCode
            wc.Headers.Add("x-tif-serviceId","");  //字符串	是	头		服务方的serviceCode

            wc.Headers.Add("x-tif-signature",sign);  //字符串	是	头		签名字符串，详见签名算法
            wc.Headers.Add("x-tif-timestamp",timestamp);  //长整形	是	头		当前 unix 时间戳
            wc.Headers.Add("x-tif-nonce",nonce);  //字符串	是	头		您（调用者）生成的非重复的随机字符串


            //
            JObject bodyStr = new JObject();
            bodyStr.Add("system_id",passid);  //1)system_id:订阅网关的paasid。
            bodyStr.Add("vender_id", "");  //2)vender_id: 业主单位的组织机构ID，如果是省人社要求开发的就填省人社的机构ID。
            bodyStr.Add("department_id","124407004561771382");  //3)department_id: 开发公司的统一社会信用代码。例如是xxx公司承接这次的开发工作,就填这家公司的统一社会信用代码。
            bodyStr.Add("query_timestamp",timestamp);  //4)query_timestamp:1970年01月01号至今的时间戳。
            bodyStr.Add("UID",nonce);  //UID,用日期时间+病人身份证号？

            //
            JObject queryStr = new JObject();
            queryStr.Add("XM",sXM);   //XM String 是 姓名
            queryStr.Add("SFZH",sSFZH);   //SFZH String 是 身份证号
            queryStr.Add("DEVICE_ID",sSBID);   //DEVICE_ID String 是 设备ID

            bodyStr.Add("query",queryStr);


            //7)audit_info:公安要求的日志审计信息。
            JObject auditStr = new JObject();
            auditStr.Add("operator_id","123");   //操作者工号
            auditStr.Add("operator_name","张三");   //操作者姓名
            auditStr.Add("query_object_id","");   //?
            auditStr.Add("query_object_id_type","01");   //?
            auditStr.Add("item_id","2");   //?
            auditStr.Add("item_code","2");   //?
            auditStr.Add("item_sequence","2");   //?
            auditStr.Add("terminal_info","1");   //?
            auditStr.Add("query_timestamp",timestamp);   //?

            bodyStr.Add("audit_info",auditStr);

            string postString = bodyStr.ToString();

            byte[] postData = Encoding.UTF8.GetBytes(postString);

            ////https://19.121.250.132/GatewayMsg/http/api/proxy/invoke
            string url = "https://jm-ztn-data.gdgov.cn/GatewayMsg/http/api/proxy/invoke/V1/PPL/PLI3/DEVICEYKMPDJKRATELIMITED";


            richTextBoxMsg.Text = "入参：";
            richTextBoxMsg.Text = richTextBoxMsg.Text  + postString + "\r\n";

            try
            {
                byte[] responseData = wc.UploadData(url, "post", postData);
                string repsString = Encoding.UTF8.GetString(responseData);//解码  
                richTextBoxMsg.Text = richTextBoxMsg.Text + "出参：\r\n";
                richTextBoxMsg.Text = richTextBoxMsg.Text + repsString + "\r\n";
                /*
                {
                    "errcode": 0,
                    "errmsg": "",
                    "data": {
                        "data": [{
                            "HMYY": "",  //HMYY String 否 红黄 码 原如是红码:红码原因为如下6种 确诊病例和核酸疑似病例,密切接触者,外省健康码红码人员,集员,居家隔离人员， 如是黄码，则可能为以下居家健康管理人员、外省健康码黄码人员
                            "XXHMYY": "",  //详细 红 黄 码 原 因
                            "SFHM": "否",  //SFHM String 否 是 是表示红/黄码,否表示绿码
                            "JCZY": "",   //JCZY String 否 解除 指 引
                            "JKMYS": "",  //JKMYS String 是 健康 码 颜 色字典值 红/黄/绿
                            "HSJG": {}    //HSJG JsonObject 否 核酸 结 果
                        }],
                        "metadata": {}
                    }
                }
                */

            }
            catch (Exception e1)
            {
                richTextBoxMsg.Text = richTextBoxMsg.Text + "错误：\r\n";
                richTextBoxMsg.Text = richTextBoxMsg.Text + e1.Message + "\r\n";
            }


        }

    }
}
